using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FiltronASP.Logger;

namespace FiltronASP.Models.DAO
{
    public class ModuleDAO : Abstracts.AbstractGenericDAO<Module, System.Nullable<int>>,
        Interfaces.IModuleDAO
    {
        /// <summary>
        /// Metoda zwracajaca nazwe parametru bedacego kluczem glownym tabeli.
        /// </summary>
        /// <returns>nazwa klucza glownego</returns>
        protected override string GetKeyProperty()
        {
            return "module_id";
        }

        /// <summary>
        /// Pobieranie listy obiektow na podstawie ich jezyka.
        /// </summary>
        /// <param name="languageId">jezyk</param>
        /// <returns>lista rekordow o zadanym jezyku</returns>
        public IQueryable<Module> FindByLanguage(int languageId)
        {
            if (languageId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<Module> modules = this._cmsEntitiesDataContext.Modules.Where(
                     modu => modu.language_id.Equals(languageId)
                    );
                if (!(modules.Any()))
                {
                    return null;
                }   //if
                return modules;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektow na podstawie ich szablonu.
        /// </summary>
        /// <param name="templateId">szablon</param>
        /// <returns>lista rekordow o zadanym szablonie</returns>
        public IQueryable<Module> FindByTemplateId(int templateId)
        {
            if (templateId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<Module> modules = this._cmsEntitiesDataContext.Modules.Where(
                     modu => (this._cmsEntitiesDataContext.ModuleTemplates.Where(
                         mote => mote.template_id.Equals(templateId)
                         ).Select(mt => mt.module_id).Contains(modu.module_id)
                         )
                    );
                if (!(modules.Any()))
                {
                    return null;
                }   //if
                return modules;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie obiektu na podstawie szablonu i nazwy modulu.
        /// </summary>
        /// <param name="templateId">szablon</param>
        /// <param name="moduleName">nazwa modulu</param>
        /// <returns>modul na podstawie szablonu i nazwy modulu</returns>
        public Module FindByTemplateIdAndModuleName(int templateId, string moduleName)
        {
            if ((templateId <= 0) || (String.IsNullOrEmpty(moduleName)))
            {
                return null;
            }   //if
            try
            {
                return this._cmsEntitiesDataContext.Modules.SingleOrDefault(
                     modu => ((this._cmsEntitiesDataContext.ModuleTemplates.Where(
                         mote => mote.template_id.Equals(templateId)
                         ).Select(mt => mt.module_id).Contains(modu.module_id)
                         ) && (modu.module_name.Equals(moduleName)))
                    );
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;            
        }

        /// <summary>
        /// Pobieranie obiektu na podstawie jezyka i nazwy modulu.
        /// </summary>
        /// <param name="languageId">jezyk</param>
        /// <param name="moduleName">nazwa modulu</param>
        /// <returns>modul na podstawie jezyka i nazwy modulu</returns>
        public Module FindByLanguageIdAndModuleName(int languageId, string moduleName)
        {
            if ((languageId <= 0) || (String.IsNullOrEmpty(moduleName)))
            {
                return null;
            }   //if
            try
            {
                return this._cmsEntitiesDataContext.Modules.SingleOrDefault(
                     modu => (modu.language_id.Equals(languageId)) && (modu.module_name.Equals(moduleName))
                    );
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Wstawianie listy obiektów na podstawie jezyka.
        /// </summary>
        /// <param name="defaultLanguageId">domyslny jezyk</param>
        /// <param name="newLanguageId">nowy jezyk</param>
        /// <returns>true jesli sie udalo, false wpp</returns>
        public bool InsertForNewLanguage(int defaultLanguageId, int newLanguageId)
        {
            if (defaultLanguageId.Equals(0) || newLanguageId.Equals(0))
            {
                return false;
            }   //if
            try
            {
                IQueryable<Module> modules = this.FindByLanguage(defaultLanguageId);
                if (modules == null)
                {
                    return true;
                }   //if
                if (!(modules.Any()))
                {
                    return true;
                }   //if
                foreach (Module modu in modules)
                {
                    Module moduleToInsert = new Module();
                    moduleToInsert.language_id = newLanguageId;
                    moduleToInsert.module_created = DateTime.Now;
                    moduleToInsert.module_description = modu.module_description;
                    moduleToInsert.module_link = modu.module_link;
                    moduleToInsert.module_modified = DateTime.Now;
                    moduleToInsert.module_name = modu.module_name;
                    this.Add(moduleToInsert);
                }

            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return true;
        }

        /// <summary>
        /// Usuwanie obiektow po jezyku.
        /// </summary>
        /// <param name="languageId">jezyk</param>
        /// <returns>true dla sukcesu, false w przeciwnym razie</returns>
        public bool DeleteByLanguage(int languageId)
        {
            if (languageId.Equals(0))
            {
                return false;
            }   //if
            try
            {
                IQueryable<Module> modules = this.FindByLanguage(languageId);
                if (modules == null)
                {
                    return true;
                }   //if
                if (!(modules.Any()))
                {
                    return true;
                }   //if
                foreach (Module mod in modules)
                {
                    this._cmsEntitiesDataContext.Modules.DeleteOnSubmit(mod);
                }
                try
                {
                    _cmsEntitiesDataContext.SubmitChanges();

                }
                catch (Exception ex)
                {
                    MyLogger.Log(ex);
                }   //catch
                return true;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return false;
        }

    }
}
